#ifndef __VTOR_FLASH_EEPROM_H_
#define __VTOR_FLASH_EEPROM_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "vtor_elec_module_config.h"

#include "vtor_printf.h"

#ifdef __VTOR_FLASH_EEPROM__

#define VTOR_EEPROM_MAX			10000
#define VTOR_EEPROM_LITTLE		1000
#define VTOR_EEPROM_BIG			9000

typedef struct
{
	uint32_t flashStartAddress;
	uint32_t flashPageSize;
	uint32_t flashPageCnt;
	uint32_t eepromSize;
}VtorFlashEeprom;

typedef struct
{
	uint32_t idx; // 递增序号，最大的为最新
	uint32_t revIdx; // 序号反码，用于校验
	//uint32_t userData[]; // 用户数据（占位符）
	
}VtorFlashEepromData;


// 使用flash记录log
typedef struct
{
	uint32_t flashStartAddress;
	uint32_t flashPageSize;
	uint32_t flashPageCnt;
}VtorFlashLogger;


// 用户自行实现flash的擦除，写入，读取函数
uint32_t VtorFlash_Lock(void);
uint32_t VtorFlash_Unlock(void);
uint32_t VtorFlash_Write32(uint32_t addr, uint32_t value);
uint32_t VtorFlash_Write64(uint32_t addr, uint64_t value);


uint32_t VtorFlash_Erase(uint32_t addr, int32_t pageCnt);
uint8_t VtorFlash_CheckAll0xff(uint32_t addr, uint32_t len);
uint32_t VtorFlash_Write(uint32_t addr, uint32_t* data, uint32_t len);
uint32_t VtorFlash_Read(uint32_t addr, uint32_t* data, uint32_t len);
uint32_t VtorFlash_OverWrite(uint32_t addr, uint32_t* data, uint32_t len);

// 寻找最新数据的地址，和寻找下一个可用的地址
uint32_t VtorFlashEeprom_GetNewDataAddr(
	VtorFlashEeprom* eeprom, uint32_t curAddr);
uint32_t VtorFlashEeprom_GetCurDataAddr(VtorFlashEeprom* eeprom);

// eeprom只提供erase、write和read方法
uint32_t VtorFlashEeprom_Erase(VtorFlashEeprom* eeprom);
uint32_t VtorFlashEeprom_Write(
	VtorFlashEeprom* eeprom, void* data, uint32_t len);
uint32_t VtorFlashEeprom_Read(
	VtorFlashEeprom* eeprom, void* data, uint32_t len);

// 调试接口，打印所有flash信息
void VtorFlashEeprom_Scan(VtorFlashEeprom* eeprom);
uint32_t VtorFlashEeprom_Test(VtorFlashEeprom* eeprom);

// 加入flashLogger函数
uint32_t VtorFlashLogger_Append(VtorFlashLogger* logger, uint8_t* logStr);
uint32_t VtorFlashLogger_Print(VtorFlashLogger* logger);

#endif // __VTOR_FLASH_EEPROM_H_

#ifdef __cplusplus
}
#endif

#endif
